package com.uzai.console.service.dy.impl;

import cn.hutool.core.collection.CollectionUtil;
import com.baomidou.mybatisplus.core.toolkit.IdWorker;
import com.baomidou.mybatisplus.core.toolkit.StringUtils;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.doudian.open.core.AccessToken;
import com.doudian.open.core.AccessTokenBuilder;
import com.uzai.common.exception.BusinessException;
import com.uzai.common.result.ResponseCode;
import com.uzai.console.common.ResponseMsg;
import com.uzai.console.common.utils.DateUtil;
import com.uzai.console.common.utils.RandomUtil;
import com.uzai.console.common.utils.Tools;
import com.uzai.console.config.UzaiConsoleSysConfig;
import com.uzai.console.dto.dy.dytoken.DyTokenIdDto;
import com.uzai.console.dto.dy.dytoken.DyTokenInfoDto;
import com.uzai.console.dto.dy.dytoken.DyTokenQuery;
import com.uzai.console.entity.DyToken;
import com.uzai.console.mapper.DyTokenMapper;
import com.uzai.console.service.dy.DyTokenService;
import com.uzai.console.vo.dy.dytoken.DyTokenAuthUrlVo;
import com.uzai.console.vo.dy.dytoken.DyTokenInfoVo;
import org.apache.commons.compress.utils.Lists;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.util.ArrayList;
import java.util.List;
import java.util.Objects;

/***
 * 抖音联盟
 * @author liuqi
 * @date 2021年08月13日 11:34
 */
@Service
public class DyTokenServiceImpl implements DyTokenService {


    Logger logger = LoggerFactory.getLogger(DyTokenServiceImpl.class);

    @Autowired
    private DyTokenMapper dyTokenMapper;
    @Autowired
    private UzaiConsoleSysConfig uzaiConsoleSysConfig;

    /**
     * 查询抖音联盟列表
     * @author liuqi
     * @date 2021/8/13 11:38
     * @param dyTokenQuery
     * @return null
     */
    public Page<DyTokenInfoVo> findDyTokenList(DyTokenQuery dyTokenQuery){
        //新建返回到页面的LIST对象
        List<DyTokenInfoVo> dyTokenInfoVoList = new ArrayList<>();

        //执行分页查询对象
        Page<DyToken> page = new Page<>();
        dyTokenQuery.convert(page);
        ArrayList<DyToken> dyOrderList =  dyTokenMapper.findByList(page, dyTokenQuery);
        if(dyOrderList != null && dyOrderList.size() > 0){
            for (DyToken dyToken : dyOrderList){
                DyTokenInfoVo dyTokenInfoVo = new DyTokenInfoVo();
                BeanUtils.copyProperties(dyToken, dyTokenInfoVo);
                dyTokenInfoVoList.add(dyTokenInfoVo);
            }
        }

        //返回到页面分页对象
        Page<DyTokenInfoVo> pageVo = new Page<>();
        BeanUtils.copyProperties(page, pageVo);
        pageVo.setRecords(dyTokenInfoVoList);
        //将分页信息复制到返回到页面的分页MO当中
        return pageVo;
    }

    /**
     * 查询抖音联盟详情
     * @author liuqi
     * @date 2021/8/13 11:38
     * @param dyTokenIdDto
     * @return null
     */
    public DyTokenInfoVo findDyTokenInfo(DyTokenIdDto dyTokenIdDto){

        if(dyTokenIdDto.getId() == null){
            throw  new BusinessException(ResponseCode.BUSINESS_EXCEPTION, ResponseMsg.PARAM_ERROR);
        }
        DyToken dyToken = dyTokenMapper.selectById(dyTokenIdDto.getId(), dyTokenIdDto.getMerId());
        if(dyToken == null){
            throw  new BusinessException(ResponseCode.BUSINESS_EXCEPTION, "该抖音联盟账号不存在");
        }

        //返回页面对象
        DyTokenInfoVo dyTokenInfoVo = new DyTokenInfoVo();
        //将查询到的对象复制给返回页面对象
        BeanUtils.copyProperties(dyToken, dyTokenInfoVo);

        return dyTokenInfoVo;
    }

    /**
     * 添加抖音联盟
     * @author liuqi
     * @date 2021/8/13 11:38
     * @param dyTokenInfoDto
     * @return null
     */
    public void addDyToken(DyTokenInfoDto dyTokenInfoDto){

        DyToken dyToken = new DyToken();

        if(StringUtils.isBlank(dyTokenInfoDto.getAccessToken())){
            throw  new BusinessException(ResponseCode.BUSINESS_EXCEPTION, "请输入联盟授权key");
        }

        if(StringUtils.isBlank(dyTokenInfoDto.getAppId())){
            throw  new BusinessException(ResponseCode.BUSINESS_EXCEPTION, "请输入抖音id");
        }

        DyToken dyToken_old = dyTokenMapper.selectByAppdId(dyTokenInfoDto.getAppId());
        if(dyToken_old != null){
            throw  new BusinessException(ResponseCode.BUSINESS_EXCEPTION, "抖音id已经存在");
        }

        String name = dyTokenInfoDto.getName();
        if(StringUtils.isBlank(name)){
            name = "抖音穿山甲账号随机名称_" + RandomUtil.getSmsCode(4);
        }

        dyToken.setId(IdWorker.getId());
        Integer now = DateUtil.getNowTime();
        dyToken.setName(name);
        dyToken.setAppId(dyTokenInfoDto.getAppId());
        dyToken.setRemark(dyTokenInfoDto.getRemark());
        dyToken.setMerId(dyTokenInfoDto.getMerId());
        dyToken.setAccessToken(dyTokenInfoDto.getAccessToken());
        dyToken.setTokenType(dyTokenInfoDto.getTokenType());
        dyToken.setType(1); //默认抖客
        dyToken.setCreateTime(now);
        dyToken.setUpdateTime(now);
        dyTokenMapper.insertSelective(dyToken);
    }

    /**
     * 修改抖音联盟
     * @author liuqi
     * @date 2021/8/13 11:38
     * @param dyTokenInfoDto
     * @return null
     */
    public void updateDyToken(DyTokenInfoDto dyTokenInfoDto){

        if(dyTokenInfoDto.getId() == null){
            throw  new BusinessException(ResponseCode.BUSINESS_EXCEPTION, "主键ID不能为空");
        }

        if(StringUtils.isBlank(dyTokenInfoDto.getAccessToken())){
            throw  new BusinessException(ResponseCode.BUSINESS_EXCEPTION, "请输入联盟授权key");
        }

        if(StringUtils.isBlank(dyTokenInfoDto.getAppId())){
            throw  new BusinessException(ResponseCode.BUSINESS_EXCEPTION, "请输入抖音id");
        }

        DyToken dyToken = dyTokenMapper.selectById(dyTokenInfoDto.getId(), dyTokenInfoDto.getMerId());

        if(dyToken == null){
            throw  new BusinessException(ResponseCode.BUSINESS_EXCEPTION, "联盟不存在");
        }

        DyToken dyToken_old = dyTokenMapper.selectByAppdId(dyTokenInfoDto.getAppId());
        if(dyToken_old != null && dyToken_old.getId().longValue() != dyToken.getId().longValue()){
            throw  new BusinessException(ResponseCode.BUSINESS_EXCEPTION, "抖音id已经存在");
        }

        String name = dyTokenInfoDto.getName();
        if(StringUtils.isBlank(name)){
            name = "抖音穿山甲账号随机名称_" + RandomUtil.getSmsCode(4);
        }

        Integer now = DateUtil.getNowTime();
        dyToken.setName(name);
        dyToken.setAppId(dyTokenInfoDto.getAppId());
        dyToken.setAccessToken(dyTokenInfoDto.getAccessToken());
        dyToken.setRemark(dyTokenInfoDto.getRemark());
        dyToken.setUpdateTime(now);
        dyTokenMapper.updateById(dyToken);
    }

    /**
     * 删除联盟
     * @author liuqi
     * @date 2021/8/13 11:38
     * @param dyTokenIdDto
     * @return null
     */
    public void deleteToken(DyTokenIdDto dyTokenIdDto){
        if(dyTokenIdDto.getId() == null){
            throw  new BusinessException(ResponseCode.BUSINESS_EXCEPTION, "主键ID不能为空");
        }
        dyTokenMapper.deleteById(dyTokenIdDto.getId(), dyTokenIdDto.getMerId());
    }

    /**
     * 查询所有抖音联盟列表
     * @author liuqi
     * @date 2021/8/13 11:38
     * @param dyTokenQuery
     * @return null
     */
        public List<DyTokenInfoVo> findDyTokenListSelect(DyTokenQuery dyTokenQuery){
        //新建返回到页面的LIST对象
        List<DyTokenInfoVo> dyTokenInfoVoList = new ArrayList<>();
        ArrayList<DyToken> dyOrderList =  dyTokenMapper.findByList(dyTokenQuery);
        if(dyOrderList != null && dyOrderList.size() > 0){
            for (DyToken dyToken : dyOrderList){
                DyTokenInfoVo dyTokenInfoVo = new DyTokenInfoVo();
                BeanUtils.copyProperties(dyToken, dyTokenInfoVo);
                dyTokenInfoVoList.add(dyTokenInfoVo);
            }
        }
        return dyTokenInfoVoList;
    }

    /***
     * 添加抖客账号授权
     * @author liuqi
     * @date 2021/8/13 11:38
     * @param merId
     * @return null
     */
    public DyTokenAuthUrlVo addDyTokenAuth(Long merId){
        //抖音联盟
        String dyTokenAuthorize =  uzaiConsoleSysConfig.getDyTokenAuthorize();
        String dyTokenAppkey = uzaiConsoleSysConfig.getDyTokenAppkey();
        dyTokenAuthorize = String.format(dyTokenAuthorize, dyTokenAppkey, merId);
        DyTokenAuthUrlVo dyTokenAuthUrlVo = new  DyTokenAuthUrlVo();
        dyTokenAuthUrlVo.setUrl(dyTokenAuthorize);
        return dyTokenAuthUrlVo;
    }

    /**
     * 修改抖客账号授权
     * @author liuqi
     * @date 2021/8/13 11:38
     * @param dyTokenInfoDto
     * @return null
     */
    public void updateDyTokenAuth(DyTokenInfoDto dyTokenInfoDto){

        if(dyTokenInfoDto.getId() == null){
            throw  new BusinessException(ResponseCode.BUSINESS_EXCEPTION, "主键ID不能为空");
        }

        if(StringUtils.isBlank(dyTokenInfoDto.getName())){
            throw  new BusinessException(ResponseCode.BUSINESS_EXCEPTION, "请输入抖客账号名称");
        }

        DyToken dyToken = dyTokenMapper.selectById(dyTokenInfoDto.getId(), dyTokenInfoDto.getMerId());

        if(dyToken == null){
            throw  new BusinessException(ResponseCode.BUSINESS_EXCEPTION, "联盟不存在");
        }

        Integer now = DateUtil.getNowTime();
        dyToken.setName(dyTokenInfoDto.getName());
        dyToken.setRemark(dyTokenInfoDto.getRemark());
        dyToken.setUpdateTime(now);
        dyTokenMapper.updateById(dyToken);
    }

    /**
     * 删除抖客账号
     * @author liuqi
     * @date 2021/8/13 11:38
     * @param dyTokenIdDto
     * @return null
     */
    public void deleteDyTokenAuth(DyTokenIdDto dyTokenIdDto){
        if(dyTokenIdDto.getId() == null){
            throw  new BusinessException(ResponseCode.BUSINESS_EXCEPTION, "主键ID不能为空");
        }
        dyTokenMapper.deleteById(dyTokenIdDto.getId(), dyTokenIdDto.getMerId());
    }

    /**
     * 刷新抖客账号授权
     * @author liuqi
     * @date 2021/8/13 11:38
     * @param dyToken
     * @return null
     */
    public void refreshDyTokenAuth(DyToken dyToken){
        if(dyToken == null || StringUtils.isBlank(dyToken.getRefreshToken())){
            return;
        }
        int now = DateUtil.getNowTime();
        AccessToken dkAccessToken = AccessTokenBuilder.refresh(dyToken.getRefreshToken());
        if(dkAccessToken != null){
            String accessToken = dkAccessToken.getAccessToken();
            String refreshToken = dkAccessToken.getRefreshToken();
            Long expireIn = Tools.getLong(dkAccessToken.getExpireIn());
            //刷新授权
            dyToken.setAccessToken(accessToken);
            dyToken.setRefreshToken(refreshToken);
            dyToken.setExptime(now + expireIn.intValue());
            dyToken.setUpdateTime(now);
            dyTokenMapper.updateByIdSelective(dyToken);

            logger.info("-刷新抖客联盟授权时间-id={}, accessToken={}, refreshToken={}, exptime={}", dyToken.getId(), accessToken, refreshToken, dyToken.getExptime());

        }
    }

    @Override
    public List<DyToken> listDyToken(Long merId, List<Long> dyAccountIds) {
        if (Objects.isNull(merId) || CollectionUtil.isEmpty(dyAccountIds)) {
            return Lists.newArrayList();
        }
        return dyTokenMapper.selectByIds(merId, dyAccountIds);
    }
}
